Starting in 2022, a breakout social media trend started the rise of a troubling trend: teenagers stealing cars for fun. The trend, started by the alleged “Kia Boys,” spread on the social media platform TikTok, where teenage boys posted videos of themselves stealing cars to take them on joyrides (Arango and Fortin 2023). Often, these videos included step-by-step instructions on how to steal a car, and many of the cars stolen were Kia and Hyundai models. Videos show an easy trick that that involves just a screw driver and a USB cord to start the car in less than a minute due to a software error (Manjoo 2023). In Figure 1, we see a significant increase in Google searches for “Kia Boys”, “Hyundai Theft”, and “Kia Theft” starting in 2022 and continuing through today.
Figure 1: Source: Google Trends, accessed April 2024
---title: "Final Data Story"author: - Marion Bauman - Matt Carswell - Thomas Sigall - Patricia Schenfelddate: last-modifieddate-format: longformat: html: code-tools: true embed-resources: true grid: body-width: 1100pxtheme: luxecho: falsebibliography: ../../references.bibvega: renderer: css: | @import url("https://fonts.googleapis.com/css2?family=Nunito+Sans:wght@200;300;400;500;600;700&display=swap"); @font-face { font-family: 'Nunito Sans'; } .vega-embed .marks text { font-family: 'Nunito Sans', sans-serif; }---```{r}# set conda environmentreticulate::use_condaenv("dsan5200", required =TRUE)``````{r}color_palette <-c("#A8C4FF", "#A56A6E", "#89B587", "#6A7FAB", "#FFDAA1", "#EFA4D6", "#7C5FBC", "#F2B37A")```# IntroductionStarting in 2022, a breakout social media trend started the rise of a troubling trend: teenagers stealing cars for fun. The trend, started by the alleged "Kia Boys," spread on the social media platform TikTok, where teenage boys posted videos of themselves stealing cars to take them on joyrides [@nyt-2023]. Often, these videos included step-by-step instructions on how to steal a car, and many of the cars stolen were Kia and Hyundai models. Videos show an easy trick that that involves just a screw driver and a USB cord to start the car in less than a minute due to a software error [@nyt-opinion]. In @fig-google-trends, we see a significant increase in Google searches for "Kia Boys", "Hyundai Theft", and "Kia Theft" starting in 2022 and continuing through today.```{python}#| label: fig-google-trends#| panel: center#| fig-cap: "Source: Google Trends, accessed April 2024"import pandas as pdimport altair as alt# Load the datakia_boys = pd.read_csv("../../data/clean/google-trends.csv")# Pivot the datakia_boys = kia_boys.melt(id_vars="week", var_name="trend", value_name="searches")kia_boys["trend"] = kia_boys["trend"].apply(lambda x: x.title())# Map colors to the trendscolors = {"Kia Boys": "#A8C4FF","Hyundai Theft": "#A56A6E","Kia Theft": "#89B587"}kia_boys["color"] = kia_boys["trend"].map(colors)cols = kia_boys["trend"].unique()## Visualize the data in Altairline = alt.Chart( kia_boys, title = alt.Title("Google Searches over Time for Car Theft Terms", subtitle = ["Searches for Kia Thefts, Hyundai Thefts, and Kia Boys in the US, 2020-2024"] ) ).mark_line().encode( x=alt.X("week:T").title("Week"), y=alt.Y("searches:Q").title("Relative Search Popularity"), color=alt.Color("trend:N").scale(domain=list(colors.keys()), range=list(colors.values())).title("Search Term"),)nearest = alt.selection_point( nearest=True, on="pointerover", fields=["week"], empty=False)points = line.mark_point(filled=True).encode( opacity=alt.condition(nearest, alt.value(1), alt.value(0)), size = alt.Size("searches:Q", scale=alt.Scale(range=[10, 800]), legend=None),)rules = alt.Chart(kia_boys).mark_rule(color="gray").encode( x="week:T",).transform_filter( nearest)rules = alt.Chart(kia_boys).transform_pivot("trend", value="searches", groupby=["week"]).mark_rule(color="gray").encode( x="week:T", opacity=alt.condition(nearest, alt.value(0.3), alt.value(0)), tooltip=[alt.Tooltip(c, type="quantitative") for c in cols],).add_params(nearest)alt.layer( line, points, rules).properties( width=625, height=400).configure_axis( grid=False, labelFontSize=12, titleFontSize=15, labelFont="Nunito Sans", titleFont="Nunito Sans",).configure_view( strokeWidth=0).configure_legend( titleFontSize=15, labelFontSize=12, labelFont="Nunito Sans", titleFont="Nunito Sans",).configure_line( strokeWidth=1.5,).configure_point( size=50).configure_title( font='Nunito Sans', fontSize=22, subtitleFontSize=15, subtitleFont='Nunito Sans', subtitleColor='#666666')```# Total US Car Thefts[@fig-total-car-thefts]```{python}#| label: fig-total-car-thefts#| panel: centerfrom vega_datasets import data# Load the datathefts = pd.read_parquet('../../data/clean/kia_hyundia_thefts.parquet')# Read in city lat and longscity_lat_long = pd.read_csv('../../data/clean/city_lat_long.csv')# Join the datathefts = thefts.merge(city_lat_long, left_on='city', right_on='city', how='left')# Drop rows were count_all is NAthefts = thefts.dropna(subset=['count_all'])# Create map linked to bar chartselect_yearmonth = alt.selection_interval( encodings=['x'], name='select')bar = alt.Chart(thefts).mark_bar().encode( x=alt.X('yearmonth(date):O', axis=alt.Axis(title='')), y=alt.Y('sum(count_all):Q').title('Total Car Thefts'), tooltip=['city:N', 'sum(count_all):Q']).properties( width=500, height =100).add_params( select_yearmonth)states = alt.topo_feature(data.us_10m.url, feature='states')background = alt.Chart(states).mark_geoshape( fill='white', stroke='#666666').properties( width=500, height=300).project('albersUsa')points = alt.Chart(thefts).mark_circle( size=20, color='#A8C4FF', opacity=0.8).encode( longitude='long:Q', latitude='lat:Q', size=alt.condition(select_yearmonth, 'count_all:Q', alt.value(0), title='Total Car Thefts'), tooltip=['city:N', 'count_all:Q']).transform_filter( select_yearmonth).properties( title=alt.Title("U.S. Car Thefts by City over Time", subtitle="Drag the bar chart to filter the map" ))# Create layoutyearalt.vconcat( background + points, bar).configure_view( strokeWidth=0).configure_axis( grid=False, labelFontSize=12, titleFontSize=15, labelFont="Nunito Sans", titleFont="Nunito Sans").configure_legend( titleFontSize=15, labelFontSize=12, labelFont="Nunito Sans", titleFont="Nunito Sans").configure_title( font='Nunito Sans', fontSize=22, subtitleFontSize=15, subtitleFont='Nunito Sans', subtitleColor='#666666')```# Kia Hyundai Thefts in the US[@fig-kia-hyundai-thefts]```{python}#| label: fig-kia-hyundai-thefts#| panel: centerimport pandas as pdimport altair as alt# Load the datathefts = pd.read_parquet('../../data/clean/kia_hyundia_thefts.parquet')city_lat_long = pd.read_csv('../../data/clean/city_lat_long.csv')thefts = thefts.merge(city_lat_long, left_on='city', right_on='city', how='left')thefts = thefts.dropna(subset=['percent_kia_hyundai'])from vega_datasets import datastates = alt.topo_feature(data.us_10m.url, feature='states')select_yearmonth = alt.selection_interval(encodings=['x'], name='brush')area = alt.Chart(thefts).mark_area(color='#A56A6E').encode( x=alt.X('yearmonth(date):T', axis=alt.Axis(title='')), y=alt.Y('average(percent_kia_hyundai):Q', axis=alt.Axis(title='Average % of Thefts')), tooltip=['yearmonth(date):T', 'average(percent_kia_hyundai):Q']).properties( width=500, height=100).add_params( select_yearmonth).properties( title=alt.Title('Average Percent of Car Thefts that are Kia or Hyundai', subtitle='Drag to select a time range' ))background = alt.Chart(states).mark_geoshape( fill='white', stroke='#666666').properties( width=500, height=300).project('albersUsa')points = alt.Chart(thefts).mark_circle( size=20, color='#A56A6E', opacity=0.6).encode( longitude='long:Q', latitude='lat:Q', tooltip=['city:N', 'percent_kia_hyundai:Q'], size=alt.condition(select_yearmonth, 'percent_kia_hyundai:Q', alt.value(0), title='Percent of Thefts')).transform_filter( select_yearmonth)alt.vconcat( area, (background + points)).configure_view( strokeWidth=0).configure_axis( grid=False, labelFontSize=12, titleFontSize=15, labelFont="Nunito Sans", titleFont="Nunito Sans").configure_legend( titleFontSize=15, labelFontSize=12, labelFont="Nunito Sans", titleFont="Nunito Sans", orient='bottom').configure_title( font='Nunito Sans', fontSize=22, subtitleFontSize=15, subtitleFont='Nunito Sans', subtitleColor='#666666')```# Car Thefts in DC[@fig-kia-hyundai-thefts-area]```{python}#| label: fig-kia-hyundai-thefts-area#| panel: center# Load the datathefts = pd.read_csv('../../data/clean/kia_hyundia_thefts.csv')# Filter city is washingtonthefts = thefts[thefts['city'] =='Washington, D.C.']# Drop NaN valuesthefts = thefts.dropna(subset=['percent_kia_hyundai'])thefts['percent_other'] =100- thefts['percent_kia_hyundai']# Rename columnsthefts = thefts.rename(columns={'percent_kia_hyundai': 'Percent Kia/Hyundai', 'percent_other': 'Percent Other Makes'})# Melting the datathefts = pd.melt(thefts, id_vars=['date'], value_vars=['Percent Other Makes', 'Percent Kia/Hyundai'], var_name='type', value_name='percent')# Create the chartchart = alt.Chart(thefts).mark_area().encode( x=alt.X('yearmonth(date):T', title=''), y=alt.Y('percent:Q', title='Percent of Thefts'), color=alt.Color('type:N', title='Type of Car', scale=alt.Scale(range=['#A8C4FF', '#A56A6E']), sort=['Percent Other Makes', 'Percent Kia/Hyundai']), tooltip=['yearmonth(date):T', 'percent:Q'], order='type:N').properties( width=600, height=400)# Change legend scale labelschart = chart.properties( title=alt.Title('Thefts by Car Make in Washington, D.C.', subtitle=['Percentage of car thefts by make in Washington, D.C. from 2020 to 2023'], ), width=600, height=400)alt.layer(chart).configure_view( strokeWidth=0).configure_axis( grid=False, labelFontSize=12, titleFontSize=15, labelFont="Nunito Sans", titleFont="Nunito Sans").configure_legend( titleFontSize=15, labelFontSize=12, labelFont="Nunito Sans", titleFont="Nunito Sans").configure_title( font='Nunito Sans', fontSize=22, subtitleFontSize=15, subtitleFont='Nunito Sans', subtitleColor='#666666')```# Car Thefts in DC* Zoom in to DC area```{r}#| column: screenlibrary(leaflet)# import tidyverse silentlysuppressPackageStartupMessages(library(tidyverse))dc_thefts <-read_csv("../../data/clean/crime_dc.csv") |>suppressMessages()dc_thefts_grouped <- dc_thefts |>summarise(.by =c(latitude, longitude, block),n =n() )providers <- leaflet::providers# Create a leaflet mapdc_thefts_grouped |>mutate(m = n/2) |>leaflet() |># addTiles() |>addProviderTiles(providers$CartoDB.Positron) |>addCircleMarkers(lng =~longitude,lat =~latitude,radius =~m,color ="#A8C4FF",stroke =FALSE,fillOpacity =0.8,popup =~paste0(n, " car thefts at ", block) ) |>setView(lng =-77.0369, lat =38.9072, zoom =12)```* Add in map of kia/hyundai thefts over time - link these two maps to each other with a time slider* Show different view of this data to emphasize increase in both car thefts and kia/hyundai thefts# Arrests in DC* Visualize top arrests in DC for adults and juveniles* Visualize car theft arrests in DC over time# Car Thefts and Arrests by Make in DC* Bring arrests, car thefts, and car thefts by make together into one visualization# Conclusion